<!DOCTYPE html>
<!-- saved from url=(0061)http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#11 -->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="https://www.facebook.com/2008/fbml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>MySQL协议分析 - 胡桃夹子</title>
    <!-- Using the latest rendering mode for IE -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    

    <!-- Open Graph tags -->
        <meta property="og:site_name" content="胡桃夹子">
            <meta property="og:type" content="article">
            <meta property="og:title" content="MySQL协议分析">
            <meta property="og:url" content="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis">
            <meta property="og:description" content="目录 目录 1 交互过程 1.1 握手认证阶段 1.2 命令执行阶段 2 基本类型 2.1 整型值 2.2 字符串（以NULL结尾）（Null-Terminated String） 2.3 二进制数据（长度编码）（Length Coded Binary） 2.4 字符串（长度编码）（Length Coded String） 3 报文结构 3.1 消息头 3.1.1 报文长度 3.1.2 序号 3.2 ...">
            <meta property="article:published_time" content="2013-11-06">
                <meta property="article:section" content="Tech">
                <meta property="article:tag" content="Protocol">
                <meta property="article:tag" content="Database">
                <meta property="article:tag" content="MySQL">
                <meta property="article:tag" content="协议">
                <meta property="article:tag" content="数据库">
                <meta property="article:author" content="hutaow">

    <!-- Bootstrap -->
        <link rel="stylesheet" href="./MySQL协议分析 - 胡桃夹子_files/bootstrap.cosmo.min.css" type="text/css">
    <link href="./MySQL协议分析 - 胡桃夹子_files/font-awesome.min.css" rel="stylesheet">

    <link href="./MySQL协议分析 - 胡桃夹子_files/native.css" rel="stylesheet">
    <link rel="stylesheet" href="./MySQL协议分析 - 胡桃夹子_files/style.css" type="text/css">

        <link href="http://hutaow.com/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="胡桃夹子 ATOM Feed">

<script type="text/javascript" async="" src="./MySQL协议分析 - 胡桃夹子_files/ga.js.下载"></script><script type="text/javascript" async="" src="http://hutaow.disqus.com/embed.js"></script><script async="" type="text/javascript" src="http://hutaow.disqus.com/count.js"></script></head>
<body>

<div class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a href="http://hutaow.com/" class="navbar-brand">
胡桃夹子            </a>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
            <ul class="nav navbar-nav">
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li><a href="http://hutaow.com/blog/archives/index.html"><i class="fa fa-th-list"></i><span class="icon-label">Archives</span></a></li>
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
</div> <!-- /.navbar -->

<div class="container">
    <div class="row">
        <div class="col-sm-9">

    <section id="content">
        <article>
            <header class="page-header">
                <h1>
                    <a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis" rel="bookmark" title="Permalink to MySQL协议分析">
                        MySQL协议分析
                    </a>
                </h1>
            </header>
            <div class="entry-content">
                <div class="panel">
                    <div class="panel-body">
<footer class="post-info">
    <span class="label label-default">Date</span>
    <span class="published">
        <i class="fa fa-calendar"></i><time datetime="2013-11-06T00:34:54+08:00"> 三 06 十一月 2013</time>
    </span>
            <span class="label label-default">By</span>
            <a href="http://hutaow.com/blog/authors/hutaow/index.html"><i class="fa fa-user"></i> hutaow</a>

        <span class="label label-default">Category</span>
        <a href="http://hutaow.com/blog/categories/tech/index.html">Tech</a>


<span class="label label-default">Tags</span>
	<a href="http://hutaow.com/blog/tags/protocol/index.html">Protocol</a>
        /
	<a href="http://hutaow.com/blog/tags/database/index.html">Database</a>
        /
	<a href="http://hutaow.com/blog/tags/mysql/index.html">MySQL</a>
        /
	<a href="http://hutaow.com/blog/tags/xie-yi/index.html">协议</a>
        /
	<a href="http://hutaow.com/blog/tags/shu-ju-ku/index.html">数据库</a>
    
</footer><!-- /.post-info -->                    </div>
                </div>
                <h2 id="_1">目录</h2>
<div class="toc">
<ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#_1">目录</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#1">1 交互过程</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#11">1.1 握手认证阶段</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#12">1.2 命令执行阶段</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#2">2 基本类型</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#21">2.1 整型值</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#22-nullnull-terminated-string">2.2 字符串（以NULL结尾）（Null-Terminated String）</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#23-length-coded-binary">2.3 二进制数据（长度编码）（Length Coded Binary）</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#24-length-coded-string">2.4 字符串（长度编码）（Length Coded String）</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#3">3 报文结构</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#31">3.1 消息头</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#311">3.1.1 报文长度</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#312">3.1.2 序号</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#32">3.2 消息体</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4">4 报文类型</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#41">4.1 登陆认证交互报文</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#411-">4.1.1 握手初始化报文（服务器 -&gt; 客户端）</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#412-">4.1.2 登陆认证报文（客户端 -&gt; 服务器）</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#42-">4.2 客户端命令请求报文（客户端 -&gt; 服务器）</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#421-com_quit">4.2.1 COM_QUIT 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#422-com_init_db">4.2.2 COM_INIT_DB 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#423-com_query">4.2.3 COM_QUERY 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#424-com_field_list">4.2.4 COM_FIELD_LIST 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#425-com_create_db">4.2.5 COM_CREATE_DB 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#426-com_drop_db">4.2.6 COM_DROP_DB 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#427-com_refresh">4.2.7 COM_REFRESH 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#428-com_shutdown">4.2.8 COM_SHUTDOWN 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#429-com_statistics">4.2.9 COM_STATISTICS 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4210-com_process_info">4.2.10 COM_PROCESS_INFO 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4211-com_process_kill">4.2.11 COM_PROCESS_KILL 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4212-com_debug">4.2.12 COM_DEBUG 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4213-com_ping">4.2.13 COM_PING 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4214-com_change_user">4.2.14 COM_CHANGE_USER 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4215-com_binlog_dump">4.2.15 COM_BINLOG_DUMP 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4216-com_table_dump">4.2.16 COM_TABLE_DUMP 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4217-com_register_slave">4.2.17 COM_REGISTER_SLAVE 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4218-com_prepare">4.2.18 COM_PREPARE 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4219-com_execute">4.2.19 COM_EXECUTE 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4220-com_long_data">4.2.20 COM_LONG_DATA 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4221-com_close_stmt">4.2.21 COM_CLOSE_STMT 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4222-com_reset_stmt">4.2.22 COM_RESET_STMT 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4223-com_set_option">4.2.23 COM_SET_OPTION 消息报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4224-com_fetch_stmt">4.2.24 COM_FETCH_STMT 消息报文</a></li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#43-">4.3 服务器响应报文（服务器 -&gt; 客户端）</a><ul>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#431-ok">4.3.1 OK 响应报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#432-error">4.3.2 Error 响应报文</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#433-result-set">4.3.3 Result Set 消息</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#434-result-set-header">4.3.4 Result Set Header 结构</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#435-field">4.3.5 Field 结构</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#436-eof">4.3.6 EOF 结构</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#437-row-data">4.3.7 Row Data 结构</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#438-row-data">4.3.8 Row Data 结构（二进制数据）</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#439-prepare_ok-prepared-statement">4.3.9 PREPARE_OK 响应报文（Prepared Statement）</a></li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#4310-parameter-prepared-statement">4.3.10 Parameter 响应报文（Prepared Statement）</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#5">5 参考资料</a></li>
</ul>
</div>
<h2 id="1">1 交互过程</h2>
<p>MySQL客户端与服务器的交互主要分为两个阶段：握手认证阶段和命令执行阶段。</p>
<h3 id="11">1.1 握手认证阶段</h3>
<p>握手认证阶段为客户端与服务器建立连接后进行，交互过程如下：</p>
<ul>
<li>服务器 -&gt; 客户端：握手初始化消息</li>
<li>客户端 -&gt; 服务器：登陆认证消息</li>
<li>服务器 -&gt; 客户端：认证结果消息</li>
</ul>
<h3 id="12">1.2 命令执行阶段</h3>
<p>客户端认证成功后，会进入命令执行阶段，交互过程如下：</p>
<ul>
<li>客户端 -&gt; 服务器：执行命令消息</li>
<li>服务器 -&gt; 客户端：命令执行结果</li>
</ul>
<!-- more -->

<p><strong>MySQL客户端与服务器的完整交互过程如下</strong>：</p>
<p><img alt="MySQL客户端与服务器交互示意图" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_message.png"></p>
<h2 id="2">2 基本类型</h2>
<h3 id="21">2.1 整型值</h3>
<p>MySQL报文中整型值分别有1、2、3、4、8字节长度，使用小字节序传输。</p>
<h3 id="22-nullnull-terminated-string">2.2 字符串（以NULL结尾）（Null-Terminated String）</h3>
<p>字符串长度不固定，当遇到'NULL'（0x00）字符时结束。</p>
<h3 id="23-length-coded-binary">2.3 二进制数据（长度编码）（Length Coded Binary）</h3>
<p>数据长度不固定，长度值由数据前的1-9个字节决定，其中长度值所占的字节数不定，字节数由第1个字节决定，如下表：</p>
<table>
<thead>
<tr>
<th>第一个字节值</th>
<th>后续字节数</th>
<th>长度值说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>0-250</td>
<td>0</td>
<td>第一个字节值即为数据的真实长度</td>
</tr>
<tr>
<td>251</td>
<td>0</td>
<td>空数据，数据的真实长度为零</td>
</tr>
<tr>
<td>252</td>
<td>2</td>
<td>后续额外2个字节标识了数据的真实长度</td>
</tr>
<tr>
<td>253</td>
<td>3</td>
<td>后续额外3个字节标识了数据的真实长度</td>
</tr>
<tr>
<td>254</td>
<td>8</td>
<td>后续额外8个字节标识了数据的真实长度</td>
</tr>
</tbody>
</table>
<h3 id="24-length-coded-string">2.4 字符串（长度编码）（Length Coded String）</h3>
<p>字符串长度不固定，无'NULL'（0x00）结束符，编码方式与上面的 Length Coded Binary 相同。</p>
<h2 id="3">3 报文结构</h2>
<p>报文分为消息头和消息体两部分，其中消息头占用固定的4个字节，消息体长度由消息头中的长度字段决定，报文结构如下：</p>
<!--
    ┏━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃                        │        ┃                                             ┃
    ┃         3 Bytes        │ 1 Byte ┃                   n Bytes                   ┃
    ┃                        │        ┃                                             ┃
    ┗━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    |<-       消息长度     ->|<-序号->|<-                 报文数据                ->|
    |                                 |                                             |
    |<-             消息头          ->|<-                  消息体                 ->|
-->

<p><img alt="MySQL报文结构" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_struct.png"></p>
<h3 id="31">3.1 消息头</h3>
<h4 id="311">3.1.1 报文长度</h4>
<p>用于标记当前请求消息的实际数据长度值，以字节为单位，占用3个字节，最大值为 0xFFFFFF，即接近 16 MB 大小（比16MB少1个字节）。</p>
<h4 id="312">3.1.2 序号</h4>
<p>在一次完整的请求/响应交互过程中，用于保证消息顺序的正确，每次客户端发起请求时，序号值都会从0开始计算。</p>
<h3 id="32">3.2 消息体</h3>
<p>消息体用于存放请求的内容及响应的数据，长度由消息头中的长度值决定。</p>
<h2 id="4">4 报文类型</h2>
<h3 id="41">4.1 登陆认证交互报文</h3>
<h4 id="411-">4.1.1 握手初始化报文（服务器 -&gt; 客户端）</h4>
<!--
    0                                   16                                  32
    ┏━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃     1 Byte      │          n Bytes (Null-Termimated String)           ┃
    ┃   协议版本号    │                服务器版本信息                       ┃
    ┣━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                                4 Bytes                                ┃
    ┃                              服务器线程ID                             ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                                                                       ┃
    ┃                                8 Bytes                                ┃
    ┃                              挑战随机数                               ┃
    ┃                                                                       ┃
    ┣━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━┫
    ┃     1 Byte      │              2 Bytes              │     1 Byte      ┃
    ┃   填充值(0x00)  │           服务器权能标志          │    字符编码     ┃
    ┣━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━┫
    ┃              2 Bytes              ┃              2 Bytes              ┃
    ┃            服务器状态             ┃        服务器权能标志(高16位)     ┃
    ┣━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃     1 Byte      │                                                     ┃
    ┃ 挑战长度(未使用)│                                                     ┃
    ┣━━━━━━━━━━━━━━━━━┷┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                               10 Bytes                                ┃
    ┃                             填充值(0x00)                              ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┯━━━━━━━━━━━━━━━━━┫
    ┃                                                     │                 ┃
    ┃                                                     │                 ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                               n Bytes                                 ┃
    ┃                    挑战随机数(第二部分，至少12字节)                   ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┯━━━━━━━━━━━━━━━━━┫
    ┃                                                     │     1 Byte      ┃
    ┃                                                     │ 挑战数结束(0x00)┃
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━┛
-->

<p><img alt="MySQL握手初始化报文" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_handshake.png"></p>
<p><strong>服务协议版本号</strong>：该值由 PROTOCOL_VERSION 宏定义决定（参考MySQL源代码<code>/include/mysql_version.h</code>头文件定义）</p>
<p><strong>服务版本信息</strong>：该值为字符串，由 MYSQL_SERVER_VERSION 宏定义决定（参考MySQL源代码<code>/include/mysql_version.h</code>头文件定义）</p>
<p><strong>服务器线程ID</strong>：服务器为当前连接所创建的线程ID。</p>
<p><strong>挑战随机数</strong>：MySQL数据库用户认证采用的是挑战/应答的方式，服务器生成该挑战数并发送给客户端，由客户端进行处理并返回相应结果，然后服务器检查是否与预期的结果相同，从而完成用户认证的过程。</p>
<p><strong>服务器权能标志</strong>：用于与客户端协商通讯方式，各标志位含义如下（参考MySQL源代码<code>/include/mysql_com.h</code>中的宏定义）：</p>
<table>
<thead>
<tr>
<th>标志位名称</th>
<th>标志位</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>CLIENT_LONG_PASSWORD</td>
<td>0x0001</td>
<td>new more secure passwords</td>
</tr>
<tr>
<td>CLIENT_FOUND_ROWS</td>
<td>0x0002</td>
<td>Found instead of affected rows</td>
</tr>
<tr>
<td>CLIENT_LONG_FLAG</td>
<td>0x0004</td>
<td>Get all column flags</td>
</tr>
<tr>
<td>CLIENT_CONNECT_WITH_DB</td>
<td>0x0008</td>
<td>One can specify db on connect</td>
</tr>
<tr>
<td>CLIENT_NO_SCHEMA</td>
<td>0x0010</td>
<td>Do not allow database.table.column</td>
</tr>
<tr>
<td>CLIENT_COMPRESS</td>
<td>0x0020</td>
<td>Can use compression protocol</td>
</tr>
<tr>
<td>CLIENT_ODBC</td>
<td>0x0040</td>
<td>Odbc client</td>
</tr>
<tr>
<td>CLIENT_LOCAL_FILES</td>
<td>0x0080</td>
<td>Can use LOAD DATA LOCAL</td>
</tr>
<tr>
<td>CLIENT_IGNORE_SPACE</td>
<td>0x0100</td>
<td>Ignore spaces before '('</td>
</tr>
<tr>
<td>CLIENT_PROTOCOL_41</td>
<td>0x0200</td>
<td>New 4.1 protocol</td>
</tr>
<tr>
<td>CLIENT_INTERACTIVE</td>
<td>0x0400</td>
<td>This is an interactive client</td>
</tr>
<tr>
<td>CLIENT_SSL</td>
<td>0x0800</td>
<td>Switch to SSL after handshake</td>
</tr>
<tr>
<td>CLIENT_IGNORE_SIGPIPE</td>
<td>0x1000</td>
<td>IGNORE sigpipes</td>
</tr>
<tr>
<td>CLIENT_TRANSACTIONS</td>
<td>0x2000</td>
<td>Client knows about transactions</td>
</tr>
<tr>
<td>CLIENT_RESERVED</td>
<td>0x4000</td>
<td>Old flag for 4.1 protocol</td>
</tr>
<tr>
<td>CLIENT_SECURE_CONNECTION</td>
<td>0x8000</td>
<td>New 4.1 authentication</td>
</tr>
<tr>
<td>CLIENT_MULTI_STATEMENTS</td>
<td>0x0001 0000</td>
<td>Enable/disable multi-stmt support</td>
</tr>
<tr>
<td>CLIENT_MULTI_RESULTS</td>
<td>0x0002 0000</td>
<td>Enable/disable multi-results</td>
</tr>
</tbody>
</table>
<p><strong>字符编码</strong>：标识服务器所使用的字符集。</p>
<p><strong>服务器状态</strong>：状态值定义如下（参考MySQL源代码<code>/include/mysql_com.h</code>中的宏定义）：</p>
<table>
<thead>
<tr>
<th>状态名称</th>
<th>状态值</th>
</tr>
</thead>
<tbody>
<tr>
<td>SERVER_STATUS_IN_TRANS</td>
<td>0x0001</td>
</tr>
<tr>
<td>SERVER_STATUS_AUTOCOMMIT</td>
<td>0x0002</td>
</tr>
<tr>
<td>SERVER_STATUS_CURSOR_EXISTS</td>
<td>0x0040</td>
</tr>
<tr>
<td>SERVER_STATUS_LAST_ROW_SENT</td>
<td>0x0080</td>
</tr>
<tr>
<td>SERVER_STATUS_DB_DROPPED</td>
<td>0x0100</td>
</tr>
<tr>
<td>SERVER_STATUS_NO_BACKSLASH_ESCAPES</td>
<td>0x0200</td>
</tr>
<tr>
<td>SERVER_STATUS_METADATA_CHANGED</td>
<td>0x0400</td>
</tr>
</tbody>
</table>
<h4 id="412-">4.1.2 登陆认证报文（客户端 -&gt; 服务器）</h4>
<p><strong> MySQL 4.0 及之前的版本</strong></p>
<!--
    0                                   16                                  32
    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃              2 Bytes              ┃              3 Bytes              ┋
    ┃           客户端权能标志          ┃           最大消息长度            ┋
    ┣━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┋                 │                                                     ┃
    ┋                 │                                                     ┃
    ┣━━━━━━━━━━━━━━━━━┷┉┉┉┉┉┉┉┉┉┉┉┉ n Bytes ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                     用户名(Null-Terminated String)                    ┃
    ┃                                                                       ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ 8 Bytes ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                   挑战认证数据(Length Coded Binary)                   ┃
    ┃                                                                       ┃
    ┣━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    ┃      1 Byte     ┃
    ┃  数据结束(0x00) ┃
    ┗━━━━━━━━━━━━━━━━━┛
-->

<p><img alt="MySQL登陆认证报文(4.0及之前的版本)" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_auth_40.png"></p>
<p><strong> MySQL 4.1 及之后的版本</strong></p>
<!--
    0                                   16                                  32
    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃              2 Bytes              ┃              2 Bytes              ┃
    ┃           客户端权能标志          ┃        客户端权能标志（扩展）     ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                                4 Bytes                                ┃
    ┃                             最大消息长度                              ┃
    ┣━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃     1 Byte      │                                                     ┃
    ┃    字符编码     │                                                     ┃
    ┣━━━━━━━━━━━━━━━━━┷┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ 23 Bytes ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                            填充值(0x00)                               ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┫
    ┃                                                                       ┃
    ┃                                                                       ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                               n Bytes                                 ┃
    ┃                     用户名(Null-Terminated String)                    ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                               n Bytes                                 ┃
    ┃                   挑战认证数据(Length Coded Binary)                   ┃
    ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
    ┃                               n Bytes                                 ┃
    ┃                 数据库名称(Null-Terminated String)(可选)              ┃
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-->

<p><img alt="MySQL登陆认证报文(4.1及之后的版本)" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_auth_41.png"></p>
<p><strong>客户端权能标志</strong>：用于与客户端协商通讯方式，标志位含义与握手初始化报文中的相同。客户端收到服务器发来的初始化报文后，会对服务器发送的权能标志进行修改，保留自身所支持的功能，然后将权能标返回给服务器，从而保证服务器与客户端通讯的兼容性。</p>
<p><strong>最大消息长度</strong>：客户端发送请求报文时所支持的最大消息长度值。</p>
<p><strong>字符编码</strong>：标识通讯过程中使用的字符编码，与服务器在认证初始化报文中发送的相同。</p>
<p><strong>用户名</strong>：客户端登陆用户的用户名称。</p>
<p><strong>挑战认证数据</strong>：客户端用户密码使用服务器发送的挑战随机数进行加密后，生成挑战认证数据，然后返回给服务器，用于对用户身份的认证。</p>
<p><strong>数据库名称</strong>：当客户端的权能标志位 CLIENT_CONNECT_WITH_DB 被置位时，该字段必须出现。</p>
<h3 id="42-">4.2 客户端命令请求报文（客户端 -&gt; 服务器）</h3>
<!--
    ┏━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃                │                                                              ┃
    ┃     1 Byte     │                         n Bytes                              ┃
    ┃                │                                                              ┃
    ┗━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    |<-    命令    ->|<-                        参数                              ->|
    |                                                                               |
    |<-                                消息体                                     ->|
-->

<p><img alt="MySQL客户端命令请求报文" src="./MySQL协议分析 - 胡桃夹子_files/mysql_protocol_command.png"></p>
<p><strong>命令</strong>：用于标识当前请求消息的类型，例如切换数据库（0x02）、查询命令（0x03）等。命令值的取值范围及说明如下表（参考MySQL源代码<code>/include/mysql_com.h</code>头文件中的定义）：</p>
<table>
<thead>
<tr>
<th>类型值</th>
<th>命令</th>
<th>功能</th>
<th>关联函数</th>
</tr>
</thead>
<tbody>
<tr>
<td>0x00</td>
<td>COM_SLEEP</td>
<td>（内部线程状态）</td>
<td>（无）</td>
</tr>
<tr>
<td>0x01</td>
<td>COM_QUIT</td>
<td>关闭连接</td>
<td>mysql_close</td>
</tr>
<tr>
<td>0x02</td>
<td>COM_INIT_DB</td>
<td>切换数据库</td>
<td>mysql_select_db</td>
</tr>
<tr>
<td>0x03</td>
<td>COM_QUERY</td>
<td>SQL查询请求</td>
<td>mysql_real_query</td>
</tr>
<tr>
<td>0x04</td>
<td>COM_FIELD_LIST</td>
<td>获取数据表字段信息</td>
<td>mysql_list_fields</td>
</tr>
<tr>
<td>0x05</td>
<td>COM_CREATE_DB</td>
<td>创建数据库</td>
<td>mysql_create_db</td>
</tr>
<tr>
<td>0x06</td>
<td>COM_DROP_DB</td>
<td>删除数据库</td>
<td>mysql_drop_db</td>
</tr>
<tr>
<td>0x07</td>
<td>COM_REFRESH</td>
<td>清除缓存</td>
<td>mysql_refresh</td>
</tr>
<tr>
<td>0x08</td>
<td>COM_SHUTDOWN</td>
<td>停止服务器</td>
<td>mysql_shutdown</td>
</tr>
<tr>
<td>0x09</td>
<td>COM_STATISTICS</td>
<td>获取服务器统计信息</td>
<td>mysql_stat</td>
</tr>
<tr>
<td>0x0A</td>
<td>COM_PROCESS_INFO</td>
<td>获取当前连接的列表</td>
<td>mysql_list_processes</td>
</tr>
<tr>
<td>0x0B</td>
<td>COM_CONNECT</td>
<td>（内部线程状态）</td>
<td>（无）</td>
</tr>
<tr>
<td>0x0C</td>
<td>COM_PROCESS_KILL</td>
<td>中断某个连接</td>
<td>mysql_kill</td>
</tr>
<tr>
<td>0x0D</td>
<td>COM_DEBUG</td>
<td>保存服务器调试信息</td>
<td>mysql_dump_debug_info</td>
</tr>
<tr>
<td>0x0E</td>
<td>COM_PING</td>
<td>测试连通性</td>
<td>mysql_ping</td>
</tr>
<tr>
<td>0x0F</td>
<td>COM_TIME</td>
<td>（内部线程状态）</td>
<td>（无）</td>
</tr>
<tr>
<td>0x10</td>
<td>COM_DELAYED_INSERT</td>
<td>（内部线程状态）</td>
<td>（无）</td>
</tr>
<tr>
<td>0x11</td>
<td>COM_CHANGE_USER</td>
<td>重新登陆（不断连接）</td>
<td>mysql_change_user</td>
</tr>
<tr>
<td>0x12</td>
<td>COM_BINLOG_DUMP</td>
<td>获取二进制日志信息</td>
<td>（无）</td>
</tr>
<tr>
<td>0x13</td>
<td>COM_TABLE_DUMP</td>
<td>获取数据表结构信息</td>
<td>（无）</td>
</tr>
<tr>
<td>0x14</td>
<td>COM_CONNECT_OUT</td>
<td>（内部线程状态）</td>
<td>（无）</td>
</tr>
<tr>
<td>0x15</td>
<td>COM_REGISTER_SLAVE</td>
<td>从服务器向主服务器进行注册</td>
<td>（无）</td>
</tr>
<tr>
<td>0x16</td>
<td>COM_STMT_PREPARE</td>
<td>预处理SQL语句</td>
<td>mysql_stmt_prepare</td>
</tr>
<tr>
<td>0x17</td>
<td>COM_STMT_EXECUTE</td>
<td>执行预处理语句</td>
<td>mysql_stmt_execute</td>
</tr>
<tr>
<td>0x18</td>
<td>COM_STMT_SEND_LONG_DATA</td>
<td>发送BLOB类型的数据</td>
<td>mysql_stmt_send_long_data</td>
</tr>
<tr>
<td>0x19</td>
<td>COM_STMT_CLOSE</td>
<td>销毁预处理语句</td>
<td>mysql_stmt_close</td>
</tr>
<tr>
<td>0x1A</td>
<td>COM_STMT_RESET</td>
<td>清除预处理语句参数缓存</td>
<td>mysql_stmt_reset</td>
</tr>
<tr>
<td>0x1B</td>
<td>COM_SET_OPTION</td>
<td>设置语句选项</td>
<td>mysql_set_server_option</td>
</tr>
<tr>
<td>0x1C</td>
<td>COM_STMT_FETCH</td>
<td>获取预处理语句的执行结果</td>
<td>mysql_stmt_fetch</td>
</tr>
</tbody>
</table>
<p><strong>参数</strong>：内容是用户在MySQL客户端输入的命令（不包括每行命令结尾的";"分号）。另外这个字段的字符串不是以NULL字符结尾，而是通过消息头中的长度值计算而来。</p>
<p>例如：当我们在MySQL客户端中执行<code>use hutaow;</code>命令时（切换到<code>hutaow</code>数据库），发送的请求报文数据会是下面的样子：</p>
<div class="highlight"><pre>0x02 0x68 0x75 0x74 0x61 0x6f 0x77
</pre></div>


<p>其中，<code>0x02</code>为请求类型值<code>COM_INIT_DB</code>，后面的<code>0x68 0x75 0x74 0x61 0x6f 0x77</code>为ASCII字符<code>hutaow</code>。</p>
<h4 id="421-com_quit">4.2.1 COM_QUIT 消息报文</h4>
<p><strong>功能</strong>：关闭当前连接（客户端退出），无参数。</p>
<h4 id="422-com_init_db">4.2.2 COM_INIT_DB 消息报文</h4>
<p><strong>功能</strong>：切换数据库，对应的SQL语句为<code>USE &lt;database&gt;</code>。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>数据库名称（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="423-com_query">4.2.3 COM_QUERY 消息报文</h4>
<p><strong>功能</strong>：最常见的请求消息类型，当用户执行SQL语句时发送该消息。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>SQL语句（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="424-com_field_list">4.2.4 COM_FIELD_LIST 消息报文</h4>
<p><strong>功能</strong>：查询某表的字段（列）信息，等同于SQL语句<code>SHOW [FULL] FIELDS FROM ...</code>。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>表格名称（Null-Terminated String）</td>
</tr>
<tr>
<td>n</td>
<td>字段（列）名称或通配符（可选）</td>
</tr>
</tbody>
</table>
<h4 id="425-com_create_db">4.2.5 COM_CREATE_DB 消息报文</h4>
<p><strong>功能</strong>：创建数据库，该消息已过时，而被SQL语句<code>CREATE DATABASE</code>代替。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>数据库名称（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="426-com_drop_db">4.2.6 COM_DROP_DB 消息报文</h4>
<p><strong>功能</strong>：删除数据库，该消息已过时，而被SQL语句<code>DROP DATABASE</code>代替。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>数据库名称（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="427-com_refresh">4.2.7 COM_REFRESH 消息报文</h4>
<p><strong>功能</strong>：清除缓存，等同于SQL语句<code>FLUSH</code>，或是执行<code>mysqladmin flush-foo</code>命令时发送该消息。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>清除缓存选项（位图方式存储，各标志位含义如下）</td>
</tr>
<tr>
<td></td>
<td>0x01: REFRESH_GRANT</td>
</tr>
<tr>
<td></td>
<td>0x02: REFRESH_LOG</td>
</tr>
<tr>
<td></td>
<td>0x04: REFRESH_TABLES</td>
</tr>
<tr>
<td></td>
<td>0x08: REFRESH_HOSTS</td>
</tr>
<tr>
<td></td>
<td>0x10: REFRESH_STATUS</td>
</tr>
<tr>
<td></td>
<td>0x20: REFRESH_THREADS</td>
</tr>
<tr>
<td></td>
<td>0x40: REFRESH_SLAVE</td>
</tr>
<tr>
<td></td>
<td>0x80: REFRESH_MASTER</td>
</tr>
</tbody>
</table>
<h4 id="428-com_shutdown">4.2.8 COM_SHUTDOWN 消息报文</h4>
<p><strong>功能</strong>：停止MySQL服务。执行<code>mysqladmin shutdown</code>命令时发送该消息。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>停止服务选项</td>
</tr>
<tr>
<td></td>
<td>0x00: SHUTDOWN_DEFAULT</td>
</tr>
<tr>
<td></td>
<td>0x01: SHUTDOWN_WAIT_CONNECTIONS</td>
</tr>
<tr>
<td></td>
<td>0x02: SHUTDOWN_WAIT_TRANSACTIONS</td>
</tr>
<tr>
<td></td>
<td>0x08: SHUTDOWN_WAIT_UPDATES</td>
</tr>
<tr>
<td></td>
<td>0x10: SHUTDOWN_WAIT_ALL_BUFFERS</td>
</tr>
<tr>
<td></td>
<td>0x11: SHUTDOWN_WAIT_CRITICAL_BUFFERS</td>
</tr>
<tr>
<td></td>
<td>0xFE: KILL_QUERY</td>
</tr>
<tr>
<td></td>
<td>0xFF: KILL_CONNECTION</td>
</tr>
</tbody>
</table>
<h4 id="429-com_statistics">4.2.9 COM_STATISTICS 消息报文</h4>
<p><strong>功能</strong>：查看MySQL服务的统计信息（例如运行时间、每秒查询次数等）。执行<code>mysqladmin status</code>命令时发送该消息，无参数。</p>
<h4 id="4210-com_process_info">4.2.10 COM_PROCESS_INFO 消息报文</h4>
<p><strong>功能</strong>：获取当前活动的线程（连接）列表。等同于SQL语句<code>SHOW PROCESSLIST</code>，或是执行<code>mysqladmin processlist</code>命令时发送该消息，无参数。</p>
<h4 id="4211-com_process_kill">4.2.11 COM_PROCESS_KILL 消息报文</h4>
<p><strong>功能</strong>：要求服务器中断某个连接。等同于SQL语句<code>KILL &lt;id&gt;</code>。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>连接ID号（小字节序）</td>
</tr>
</tbody>
</table>
<h4 id="4212-com_debug">4.2.12 COM_DEBUG 消息报文</h4>
<p><strong>功能</strong>：要求服务器将调试信息保存下来，保存的信息多少依赖于编译选项设置（debug=no|yes|full）。执行<code>mysqladmin debug</code>命令时发送该消息，无参数。</p>
<h4 id="4213-com_ping">4.2.13 COM_PING 消息报文</h4>
<p><strong>功能</strong>：该消息用来测试连通性，同时会将服务器的无效连接（超时）计数器清零。执行<code>mysqladmin ping</code>命令时发送该消息，无参数。</p>
<h4 id="4214-com_change_user">4.2.14 COM_CHANGE_USER 消息报文</h4>
<p><strong>功能</strong>：在不断连接的情况下重新登陆，该操作会销毁MySQL服务器端的会话上下文（包括临时表、会话变量等）。有些连接池用这种方法实现清除会话上下文。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>用户名（字符串以NULL结尾）</td>
</tr>
<tr>
<td>n</td>
<td>密码（挑战数）</td>
</tr>
<tr>
<td></td>
<td>MySQL 3.23 版本：Null-Terminated String（长度9字节）</td>
</tr>
<tr>
<td></td>
<td>MySQL 4.1 版本：Length Coded String（长度1+21字节）</td>
</tr>
<tr>
<td>n</td>
<td>数据库名称（Null-Terminated String）</td>
</tr>
<tr>
<td>2</td>
<td>字符编码</td>
</tr>
</tbody>
</table>
<h4 id="4215-com_binlog_dump">4.2.15 COM_BINLOG_DUMP 消息报文</h4>
<p><strong>功能</strong>：该消息是备份连接时由从服务器向主服务器发送的最后一个请求，主服务器收到后，会响应一系列的报文，每个报文都包含一个二进制日志事件。如果主服务器出现故障时，会发送一个EOF报文。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>二进制日志数据的起始位置（小字节序）</td>
</tr>
<tr>
<td>4</td>
<td>二进制日志数据标志位（目前未使用，永远为0x00）</td>
</tr>
<tr>
<td>4</td>
<td>从服务器的服务器ID值（小字节序）</td>
</tr>
<tr>
<td>n</td>
<td>二进制日志的文件名称（可选，默认值为主服务器上第一个有效的文件名）</td>
</tr>
</tbody>
</table>
<h4 id="4216-com_table_dump">4.2.16 COM_TABLE_DUMP 消息报文</h4>
<p><strong>功能</strong>：将数据表从主服务器复制到从服务器中，执行SQL语句<code>LOAD TABLE ... FROM MASTER</code>时发送该消息。目前该消息已过时，不再使用。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>数据库名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>数据表名称（Length Coded String）</td>
</tr>
</tbody>
</table>
<h4 id="4217-com_register_slave">4.2.17 COM_REGISTER_SLAVE 消息报文</h4>
<p><strong>功能</strong>：在从服务器<code>report_host</code>变量设置的情况下，当备份连接时向主服务器发送的注册消息。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>从服务器ID值（小字节序）</td>
</tr>
<tr>
<td>n</td>
<td>主服务器IP地址（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>主服务器用户名（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>主服务器密码（Length Coded String）</td>
</tr>
<tr>
<td>2</td>
<td>主服务器端口号</td>
</tr>
<tr>
<td>4</td>
<td>安全备份级别（由MySQL服务器<code>rpl_recovery_rank</code>变量设置，暂时未使用）</td>
</tr>
<tr>
<td>4</td>
<td>主服务器ID值（值恒为0x00）</td>
</tr>
</tbody>
</table>
<h4 id="4218-com_prepare">4.2.18 COM_PREPARE 消息报文</h4>
<p><strong>功能</strong>：预处理SQL语句，使用带有"?"占位符的SQL语句时发送该消息。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>带有"?"占位符的SQL语句（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="4219-com_execute">4.2.19 COM_EXECUTE 消息报文</h4>
<p><strong>功能</strong>：执行预处理语句。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值</td>
</tr>
<tr>
<td>1</td>
<td>标志位</td>
</tr>
<tr>
<td></td>
<td>0x00: CURSOR_TYPE_NO_CURSOR</td>
</tr>
<tr>
<td></td>
<td>0x01: CURSOR_TYPE_READ_ONLY</td>
</tr>
<tr>
<td></td>
<td>0x02: CURSOR_TYPE_FOR_UPDATE</td>
</tr>
<tr>
<td></td>
<td>0x04: CURSOR_TYPE_SCROLLABLE</td>
</tr>
<tr>
<td>4</td>
<td>保留（值恒为0x01）</td>
</tr>
<tr>
<td>如果参数数量大于0</td>
<td></td>
</tr>
<tr>
<td>n</td>
<td>空位图（Null-Bitmap，长度 = (参数数量 + 7) / 8 字节）</td>
</tr>
<tr>
<td>1</td>
<td>参数分隔标志</td>
</tr>
<tr>
<td>如果参数分隔标志值为1</td>
<td></td>
</tr>
<tr>
<td>n</td>
<td>每个参数的类型值（长度 = 参数数量 * 2 字节）</td>
</tr>
<tr>
<td>n</td>
<td>每个参数的值</td>
</tr>
</tbody>
</table>
<h4 id="4220-com_long_data">4.2.20 COM_LONG_DATA 消息报文</h4>
<p>该消息报文有两种形式，一种用于发送二进制数据，另一种用于发送文本数据。</p>
<p><strong>功能</strong>：用于发送二进制（BLOB）类型的数据（调用<code>mysql_stmt_send_long_data</code>函数）。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值（小字节序）</td>
</tr>
<tr>
<td>2</td>
<td>参数序号（小字节序）</td>
</tr>
<tr>
<td>n</td>
<td>数据负载（数据到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<p><strong>功能</strong>：用于发送超长字符串类型的数据（调用<code>mysql_send_long_data</code>函数）</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值（小字节序）</td>
</tr>
<tr>
<td>2</td>
<td>参数序号（小字节序）</td>
</tr>
<tr>
<td>2</td>
<td>数据类型（未使用）</td>
</tr>
<tr>
<td>n</td>
<td>数据负载（数据到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<h4 id="4221-com_close_stmt">4.2.21 COM_CLOSE_STMT 消息报文</h4>
<p><strong>功能</strong>：销毁预处理语句。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值（小字节序）</td>
</tr>
</tbody>
</table>
<h4 id="4222-com_reset_stmt">4.2.22 COM_RESET_STMT 消息报文</h4>
<p><strong>功能</strong>：将预处理语句的参数缓存清空。多数情况和<code>COM_LONG_DATA</code>一起使用。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值（小字节序）</td>
</tr>
</tbody>
</table>
<h4 id="4223-com_set_option">4.2.23 COM_SET_OPTION 消息报文</h4>
<p><strong>功能</strong>：设置语句选项，选项值为<code>/include/mysql_com.h</code>头文件中定义的<code>enum_mysql_set_option</code>枚举类型：</p>
<ul>
<li>MYSQL_OPTION_MULTI_STATEMENTS_ON</li>
<li>MYSQL_OPTION_MULTI_STATEMENTS_OFF</li>
</ul>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>2</td>
<td>选项值（小字节序）</td>
</tr>
</tbody>
</table>
<h4 id="4224-com_fetch_stmt">4.2.24 COM_FETCH_STMT 消息报文</h4>
<p><strong>功能</strong>：获取预处理语句的执行结果（一次可以获取多行数据）。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>4</td>
<td>预处理语句的ID值（小字节序）</td>
</tr>
<tr>
<td>4</td>
<td>数据的行数（小字节序）</td>
</tr>
</tbody>
</table>
<h3 id="43-">4.3 服务器响应报文（服务器 -&gt; 客户端）</h3>
<p>当客户端发起认证请求或命令请求后，服务器会返回相应的执行结果给客户端。客户端在收到响应报文后，需要首先检查第1个字节的值，来区分响应报文的类型。</p>
<table>
<thead>
<tr>
<th>响应报文类型</th>
<th>第1个字节取值范围</th>
</tr>
</thead>
<tbody>
<tr>
<td>OK 响应报文</td>
<td>0x00</td>
</tr>
<tr>
<td>Error 响应报文</td>
<td>0xFF</td>
</tr>
<tr>
<td>Result Set 报文</td>
<td>0x01 - 0xFA</td>
</tr>
<tr>
<td>Field 报文</td>
<td>0x01 - 0xFA</td>
</tr>
<tr>
<td>Row Data 报文</td>
<td>0x01 - 0xFA</td>
</tr>
<tr>
<td>EOF 报文</td>
<td>0xFE</td>
</tr>
</tbody>
</table>
<p>注：响应报文的第1个字节在不同类型中含义不同，比如在OK报文中，该字节并没有实际意义，值恒为0x00；而在Result Set报文中，该字节又是长度编码的二进制数据结构（Length Coded Binary）中的第1字节。</p>
<h4 id="431-ok">4.3.1 OK 响应报文</h4>
<p>客户端的命令执行正确时，服务器会返回OK响应报文。</p>
<p><strong> MySQL 4.0 及之前的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>OK报文，值恒为0x00</td>
</tr>
<tr>
<td>1-9</td>
<td>受影响行数（Length Coded Binary）</td>
</tr>
<tr>
<td>1-9</td>
<td>索引ID值（Length Coded Binary）</td>
</tr>
<tr>
<td>2</td>
<td>服务器状态</td>
</tr>
<tr>
<td>n</td>
<td>服务器消息（字符串到达消息尾部时结束，无结束符）</td>
</tr>
</tbody>
</table>
<p><strong> MySQL 4.1 及之后的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>OK报文，值恒为0x00</td>
</tr>
<tr>
<td>1-9</td>
<td>受影响行数（Length Coded Binary）</td>
</tr>
<tr>
<td>1-9</td>
<td>索引ID值（Length Coded Binary）</td>
</tr>
<tr>
<td>2</td>
<td>服务器状态</td>
</tr>
<tr>
<td>2</td>
<td>告警计数</td>
</tr>
<tr>
<td>n</td>
<td>服务器消息（字符串到达消息尾部时结束，无结束符，可选）</td>
</tr>
</tbody>
</table>
<p><strong>受影响行数</strong>：当执行<code>INSERT</code>/<code>UPDATE</code>/<code>DELETE</code>语句时所影响的数据行数。</p>
<p><strong>索引ID值</strong>：该值为<code>AUTO_INCREMENT</code>索引字段生成，如果没有索引字段，则为0x00。注意：当<code>INSERT</code>插入语句为多行数据时，该索引ID值为第一个插入的数据行索引值，而非最后一个。</p>
<p><strong>服务器状态</strong>：客户端可以通过该值检查命令是否在事务处理中。</p>
<p><strong>告警计数</strong>：告警发生的次数。</p>
<p><strong>服务器消息</strong>：服务器返回给客户端的消息，一般为简单的描述性字符串，可选字段。</p>
<h4 id="432-error">4.3.2 Error 响应报文</h4>
<p><strong> MySQL 4.0 及之前的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Error报文，值恒为0xFF</td>
</tr>
<tr>
<td>2</td>
<td>错误编号（小字节序）</td>
</tr>
<tr>
<td>n</td>
<td>服务器消息</td>
</tr>
</tbody>
</table>
<p><strong> MySQL 4.1 及之后的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Error报文，值恒为0xFF</td>
</tr>
<tr>
<td>2</td>
<td>错误编号（小字节序）</td>
</tr>
<tr>
<td>1</td>
<td>服务器状态标志，恒为'#'字符</td>
</tr>
<tr>
<td>5</td>
<td>服务器状态（5个字符）</td>
</tr>
<tr>
<td>n</td>
<td>服务器消息</td>
</tr>
</tbody>
</table>
<p><strong>错误编号</strong>：错误编号值定义在源代码<code>/include/mysqld_error.h</code>头文件中。</p>
<p><strong>服务器状态</strong>：服务器将错误编号通过<code>mysql_errno_to_sqlstate</code>函数转换为状态值，状态值由5字节的ASCII字符组成，定义在源代码<code>/include/sql_state.h</code>头文件中。</p>
<p><strong>服务器消息</strong>：错误消息字符串到达消息尾时结束，长度可以由消息头中的长度值计算得出。消息长度为0-512字节。</p>
<h4 id="433-result-set">4.3.3 Result Set 消息</h4>
<p>当客户端发送查询请求后，在没有错误的情况下，服务器会返回结果集（Result Set）给客户端。</p>
<p>Result Set 消息分为五部分，结构如下：</p>
<table>
<thead>
<tr>
<th>结构</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>[Result Set Header]</td>
<td>列数量</td>
</tr>
<tr>
<td>[Field]</td>
<td>列信息（多个）</td>
</tr>
<tr>
<td>[EOF]</td>
<td>列结束</td>
</tr>
<tr>
<td>[Row Data]</td>
<td>行数据（多个）</td>
</tr>
<tr>
<td>[EOF]</td>
<td>数据结束</td>
</tr>
</tbody>
</table>
<h4 id="434-result-set-header">4.3.4 Result Set Header 结构</h4>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1-9</td>
<td>Field结构计数（Length Coded Binary）</td>
</tr>
<tr>
<td>1-9</td>
<td>额外信息（Length Coded Binary）</td>
</tr>
</tbody>
</table>
<p><strong>Field结构计数</strong>：用于标识Field结构的数量，取值范围0x00-0xFA。</p>
<p><strong>额外信息</strong>：可选字段，一般情况下不应该出现。只有像<code>SHOW COLUMNS</code>这种语句的执行结果才会用到额外信息（标识表格的列数量）。</p>
<h4 id="435-field">4.3.5 Field 结构</h4>
<p>Field为数据表的列信息，在Result Set中，Field会连续出现多次，次数由Result Set Header结构中的IField结构计数值决定。</p>
<p><strong> MySQL 4.0 及之前的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>数据表名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>列（字段）名称（Length Coded String）</td>
</tr>
<tr>
<td>4</td>
<td>列（字段）长度（Length Coded String）</td>
</tr>
<tr>
<td>2</td>
<td>列（字段）类型（Length Coded String）</td>
</tr>
<tr>
<td>2</td>
<td>列（字段）标志（Length Coded String）</td>
</tr>
<tr>
<td>1</td>
<td>整型值精度</td>
</tr>
<tr>
<td>n</td>
<td>默认值（Length Coded String）</td>
</tr>
</tbody>
</table>
<p><strong> MySQL 4.1 及之后的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>目录名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>数据库名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>数据表名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>数据表原始名称（Length Coded String）</td>
</tr>
<tr>
<td>n</td>
<td>列（字段）名称（Length Coded String）</td>
</tr>
<tr>
<td>4</td>
<td>列（字段）原始名称（Length Coded String）</td>
</tr>
<tr>
<td>1</td>
<td>填充值</td>
</tr>
<tr>
<td>2</td>
<td>字符编码</td>
</tr>
<tr>
<td>4</td>
<td>列（字段）长度</td>
</tr>
<tr>
<td>1</td>
<td>列（字段）类型</td>
</tr>
<tr>
<td>2</td>
<td>列（字段）标志</td>
</tr>
<tr>
<td>1</td>
<td>整型值精度</td>
</tr>
<tr>
<td>2</td>
<td>填充值（0x00）</td>
</tr>
<tr>
<td>n</td>
<td>默认值（Length Coded String）</td>
</tr>
</tbody>
</table>
<p><strong>目录名称</strong>：在4.1及之后的版本中，该字段值为"def"。</p>
<p><strong>数据库名称</strong>：数据库名称标识。</p>
<p><strong>数据表名称</strong>：数据表的别名（<code>AS</code>之后的名称）。</p>
<p><strong>数据表原始名称</strong>：数据表的原始名称（<code>AS</code>之前的名称）。</p>
<p><strong>列（字段）名称</strong>：列（字段）的别名（<code>AS</code>之后的名称）。</p>
<p><strong>列（字段）原始名称</strong>：列（字段）的原始名称（<code>AS</code>之前的名称）。</p>
<p><strong>字符编码</strong>：列（字段）的字符编码值。</p>
<p><strong>列（字段）长度</strong>：列（字段）的长度值，真实长度可能小于该值，例如<code>VARCHAR(2)</code>类型的字段实际只能存储1个字符。</p>
<p><strong>列（字段）类型</strong>：列（字段）的类型值，取值范围如下（参考源代码<code>/include/mysql_com.h</code>头文件中的<code>enum_field_type</code>枚举类型定义）：</p>
<table>
<thead>
<tr>
<th>类型值</th>
<th>名称</th>
</tr>
</thead>
<tbody>
<tr>
<td>0x00</td>
<td>FIELD_TYPE_DECIMAL</td>
</tr>
<tr>
<td>0x01</td>
<td>FIELD_TYPE_TINY</td>
</tr>
<tr>
<td>0x02</td>
<td>FIELD_TYPE_SHORT</td>
</tr>
<tr>
<td>0x03</td>
<td>FIELD_TYPE_LONG</td>
</tr>
<tr>
<td>0x04</td>
<td>FIELD_TYPE_FLOAT</td>
</tr>
<tr>
<td>0x05</td>
<td>FIELD_TYPE_DOUBLE</td>
</tr>
<tr>
<td>0x06</td>
<td>FIELD_TYPE_NULL</td>
</tr>
<tr>
<td>0x07</td>
<td>FIELD_TYPE_TIMESTAMP</td>
</tr>
<tr>
<td>0x08</td>
<td>FIELD_TYPE_LONGLONG</td>
</tr>
<tr>
<td>0x09</td>
<td>FIELD_TYPE_INT24</td>
</tr>
<tr>
<td>0x0A</td>
<td>FIELD_TYPE_DATE</td>
</tr>
<tr>
<td>0x0B</td>
<td>FIELD_TYPE_TIME</td>
</tr>
<tr>
<td>0x0C</td>
<td>FIELD_TYPE_DATETIME</td>
</tr>
<tr>
<td>0x0D</td>
<td>FIELD_TYPE_YEAR</td>
</tr>
<tr>
<td>0x0E</td>
<td>FIELD_TYPE_NEWDATE</td>
</tr>
<tr>
<td>0x0F</td>
<td>FIELD_TYPE_VARCHAR (new in MySQL 5.0)</td>
</tr>
<tr>
<td>0x10</td>
<td>FIELD_TYPE_BIT (new in MySQL 5.0)</td>
</tr>
<tr>
<td>0xF6</td>
<td>FIELD_TYPE_NEWDECIMAL (new in MYSQL 5.0)</td>
</tr>
<tr>
<td>0xF7</td>
<td>FIELD_TYPE_ENUM</td>
</tr>
<tr>
<td>0xF8</td>
<td>FIELD_TYPE_SET</td>
</tr>
<tr>
<td>0xF9</td>
<td>FIELD_TYPE_TINY_BLOB</td>
</tr>
<tr>
<td>0xFA</td>
<td>FIELD_TYPE_MEDIUM_BLOB</td>
</tr>
<tr>
<td>0xFB</td>
<td>FIELD_TYPE_LONG_BLOB</td>
</tr>
<tr>
<td>0xFC</td>
<td>FIELD_TYPE_BLOB</td>
</tr>
<tr>
<td>0xFD</td>
<td>FIELD_TYPE_VAR_STRING</td>
</tr>
<tr>
<td>0xFE</td>
<td>FIELD_TYPE_STRING</td>
</tr>
<tr>
<td>0xFF</td>
<td>FIELD_TYPE_GEOMETRY</td>
</tr>
</tbody>
</table>
<p><strong>列（字段）标志</strong>：各标志位定义如下（参考源代码<code>/include/mysql_com.h</code>头文件中的宏定义）：</p>
<table>
<thead>
<tr>
<th>标志位</th>
<th>名称</th>
</tr>
</thead>
<tbody>
<tr>
<td>0x0001</td>
<td>NOT_NULL_FLAG</td>
</tr>
<tr>
<td>0x0002</td>
<td>PRI_KEY_FLAG</td>
</tr>
<tr>
<td>0x0004</td>
<td>UNIQUE_KEY_FLAG</td>
</tr>
<tr>
<td>0x0008</td>
<td>MULTIPLE_KEY_FLAG</td>
</tr>
<tr>
<td>0x0010</td>
<td>BLOB_FLAG</td>
</tr>
<tr>
<td>0x0020</td>
<td>UNSIGNED_FLAG</td>
</tr>
<tr>
<td>0x0040</td>
<td>ZEROFILL_FLAG</td>
</tr>
<tr>
<td>0x0080</td>
<td>BINARY_FLAG</td>
</tr>
<tr>
<td>0x0100</td>
<td>ENUM_FLAG</td>
</tr>
<tr>
<td>0x0200</td>
<td>AUTO_INCREMENT_FLAG</td>
</tr>
<tr>
<td>0x0400</td>
<td>TIMESTAMP_FLAG</td>
</tr>
<tr>
<td>0x0800</td>
<td>SET_FLAG</td>
</tr>
</tbody>
</table>
<p><strong>数值精度</strong>：该字段对<code>DECIMAL</code>和<code>NUMERIC</code>类型的数值字段有效，用于标识数值的精度（小数点位置）。</p>
<p><strong>默认值</strong>：该字段用在数据表定义中，普通的查询结果中不会出现。</p>
<p><strong>附</strong>：Field结构的相关处理函数：</p>
<ul>
<li>客户端：<code>/client/client.c</code>源文件中的<code>unpack_fields</code>函数</li>
<li>服务器：<code>/sql/sql_base.cc</code>源文件中的<code>send_fields</code>函数</li>
</ul>
<h4 id="436-eof">4.3.6 EOF 结构</h4>
<p>EOF结构用于标识Field和Row Data的结束，在预处理语句中，EOF也被用来标识参数的结束。</p>
<p><strong> MySQL 4.0 及之前的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>EOF值（0xFE）</td>
</tr>
</tbody>
</table>
<p><strong> MySQL 4.1 及之后的版本</strong></p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>EOF值（0xFE）</td>
</tr>
<tr>
<td>2</td>
<td>告警计数</td>
</tr>
<tr>
<td>2</td>
<td>状态标志位</td>
</tr>
</tbody>
</table>
<p><strong>告警计数</strong>：服务器告警数量，在所有数据都发送给客户端后该值才有效。</p>
<p><strong>状态标志位</strong>：包含类似<code>SERVER_MORE_RESULTS_EXISTS</code>这样的标志位。</p>
<p><strong>注</strong>：由于EOF值与其它Result Set结构共用1字节，所以在收到报文后需要对EOF包的真实性进行校验，校验条件为：</p>
<ul>
<li>第1字节值为0xFE</li>
<li>包长度小于9字节</li>
</ul>
<p><strong>附</strong>：EOF结构的相关处理函数：</p>
<ul>
<li>服务器：<code>protocol.cc</code>源文件中的<code>send_eof</code>函数</li>
</ul>
<h4 id="437-row-data">4.3.7 Row Data 结构</h4>
<p>在Result Set消息中，会包含多个Row Data结构，每个Row Data结构又包含多个字段值，这些字段值组成一行数据。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>n</td>
<td>字段值（Length Coded String）</td>
</tr>
<tr>
<td>...</td>
<td>（一行数据中包含多个字段值）</td>
</tr>
</tbody>
</table>
<p><strong>字段值</strong>：行数据中的字段值，字符串形式。</p>
<p><strong>附</strong>：Row Data结构的相关处理函数：</p>
<ul>
<li>客户端：<code>/client/client.c</code>源文件中的<code>read_rows</code>函数</li>
</ul>
<h4 id="438-row-data">4.3.8 Row Data 结构（二进制数据）</h4>
<p>该结构用于传输二进制的字段值，既可以是服务器返回的结果，也可以是由客户端发送的（当执行预处理语句时，客户端使用Result Set消息来发送参数及数据）。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>结构头（0x00）</td>
</tr>
<tr>
<td>(列数量 + 7 + 2) / 8</td>
<td>空位图</td>
</tr>
<tr>
<td>n</td>
<td>字段值</td>
</tr>
<tr>
<td>...</td>
<td>（一行数据中包含多个字段值）</td>
</tr>
</tbody>
</table>
<p><strong>空位图</strong>：前2个比特位被保留，值分别为0和1，以保证不会和OK、Error包的首字节冲突。在MySQL 5.0及之后的版本中，这2个比特位的值都为0。</p>
<p><strong>字段值</strong>：行数据中的字段值，二进制形式。</p>
<h4 id="439-prepare_ok-prepared-statement">4.3.9 PREPARE_OK 响应报文（Prepared Statement）</h4>
<p>用于响应客户端发起的预处理语句报文，组成结构如下：</p>
<table>
<thead>
<tr>
<th>结构</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>[PREPARE_OK]</td>
<td>PREPARE_OK结构</td>
</tr>
<tr>
<td>如果参数数量大于0</td>
<td></td>
</tr>
<tr>
<td>[Field]</td>
<td>与Result Set消息结构相同</td>
</tr>
<tr>
<td>[EOF]</td>
<td></td>
</tr>
<tr>
<td>如果列数大于0</td>
<td></td>
</tr>
<tr>
<td>[Field]</td>
<td>与Result Set消息结构相同</td>
</tr>
<tr>
<td>[EOF]</td>
<td></td>
</tr>
</tbody>
</table>
<p>其中 PREPARD_OK 的结构如下：</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>OK报文，值为0x00</td>
</tr>
<tr>
<td>4</td>
<td>预处理语句ID值</td>
</tr>
<tr>
<td>2</td>
<td>列数量</td>
</tr>
<tr>
<td>2</td>
<td>参数数量</td>
</tr>
<tr>
<td>1</td>
<td>填充值（0x00）</td>
</tr>
<tr>
<td>2</td>
<td>告警计数</td>
</tr>
</tbody>
</table>
<h4 id="4310-parameter-prepared-statement">4.3.10 Parameter 响应报文（Prepared Statement）</h4>
<p>预处理语句的值与参数正确对应后，服务器会返回 Parameter 报文。</p>
<table>
<thead>
<tr>
<th>字节</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>2</td>
<td>类型</td>
</tr>
<tr>
<td>2</td>
<td>标志</td>
</tr>
<tr>
<td>1</td>
<td>数值精度</td>
</tr>
<tr>
<td>4</td>
<td>字段长度</td>
</tr>
</tbody>
</table>
<p><strong>类型</strong>：与 Field 结构中的字段类型相同。</p>
<p><strong>标志</strong>：与 Field 结构中的字段标志相同。</p>
<p><strong>数值精度</strong>：与 Field 结构中的数值精度相同。</p>
<p><strong>字段长度</strong>：与 Field 结构中的字段长度相同。</p>
<h2 id="5">5 参考资料</h2>
<p>《<a href="http://dev.mysql.com/doc/internals/en/index.html">MySQL Internals Manual</a>: <a href="http://dev.mysql.com/doc/internals/en/client-server-protocol.html">MySQL Client/Server Protocol</a>》</p>
            </div>
            <!-- /.entry-content -->
    <hr>
    <section class="comments" id="comments">
        <h2>Comments</h2>

        <div id="disqus_thread"></div>
        <script type="text/javascript">
            /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
            var disqus_shortname = 'hutaow'; // required: replace example with your forum shortname

                    var disqus_identifier = 'mysql-protocol-analysis';
                var disqus_url = 'http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis';

            var disqus_config = function () {
                this.language = "en";
            };

            /* * * DON'T EDIT BELOW THIS LINE * * */
            (function () {
                var dsq = document.createElement('script');
                dsq.type = 'text/javascript';
                dsq.async = true;
                dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
                (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
            })();
        </script>
        <noscript>Please enable JavaScript to view the &lt;a href="http://disqus.com/?ref_noscript"&gt;comments powered by
            Disqus.&lt;/a&gt;</noscript>
        <a href="http://disqus.com/" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>

    </section>
        </article>
    </section>

        </div>
        <div class="col-sm-3 well well-sm" id="sidebar">

<aside>
    <section>
        <ul class="list-group list-group-flush">
                <li class="list-group-item"><h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Social</span></h4>
                  <ul class="list-group" id="social">
                    <li class="list-group-item"><a href="http://www.linkedin.com/in/hutaow"><i class="fa fa-linkedin-square fa-lg"></i> LinkedIn
                    </a></li>
                    <li class="list-group-item"><a href="http://www.weibo.com/hutaow"><i class="fa fa-weibo-square fa-lg"></i> Weibo
                    </a></li>
                    <li class="list-group-item"><a href="http://hutaow.com/feeds/all.atom.xml"><i class="fa fa-rss-square fa-lg"></i> RSS
                    </a></li>
                  </ul>
                </li>

                <li class="list-group-item"><h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Recent Posts</span></h4>
                    <ul class="list-group" id="recentposts">
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2015/02/14/ld-o">
                                如何将多个.o合并为一个.o文件
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/11/02/configure-openwrt-samba-shared-service">
                                配置OpenWRT的Samba共享服务
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/09/08/write-tcp-mapping-program-with-python">
                                用 Python 实现端口映射功能
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux">
                                Linux中查看进程占用内存的情况
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/08/02/svautomusic-cracker">
                                德赛西威音乐e栈的破解程序
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/08/01/cracking-svautomusic">
                                一种伪造服务器骗过某导航的音乐服务，从而延长有效期的方法
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/06/13/restrict-user-login-linux-time">
                                限制用户登陆Linux的时间
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/06/02/undo-commits-permanently-in-git">
                                删除Git的提交记录
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/05/29/libpcap-based-development">
                                基于libpcap的开发实例
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/2014/05/26/batch-replace-string-in-files">
                                在多个文件中批量查找/替换字符串
                            </a>
                        </li>
                    </ul>
                </li>

                <li class="list-group-item"><a href="http://hutaow.com/blog/categories/index.html"><h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Categories</span></h4></a>
                    <ul class="list-group" id="categories">
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/categories/living/index.html">
                                <i class="fa fa-folder-open fa-lg"></i> Living
                            </a>
                        </li>
                        <li class="list-group-item">
                            <a href="http://hutaow.com/blog/categories/tech/index.html">
                                <i class="fa fa-folder-open fa-lg"></i> Tech
                            </a>
                        </li>
                    </ul>
                </li>

                <li class="list-group-item"><a href="http://hutaow.com/blog/tags/index.html"><h4><i class="fa fa-tags fa-lg"></i><span class="icon-label">Tags</span></h4></a>
                    <ul class="list-group list-inline tagcloud" id="tags">
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags//index.html">
                                
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/android/index.html">
                                Android
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/archlinux/index.html">
                                ArchLinux
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/atl/index.html">
                                ATL
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/c/index.html">
                                C
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/chmod/index.html">
                                chmod
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/cisco/index.html">
                                CISCO
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/core-dump/index.html">
                                Core Dump
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/cracker/index.html">
                                Cracker
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/cron/index.html">
                                cron
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/cscope/index.html">
                                CScope
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/csharp/index.html">
                                CSharp
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/ctags/index.html">
                                CTags
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/dai-li/index.html">
                                代理
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/database/index.html">
                                Database
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/de-sai-xi-wei/index.html">
                                德赛西威
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/diao-shi/index.html">
                                调试
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/diao-yong-zhan/index.html">
                                调用栈
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/ding-wei/index.html">
                                定位
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/duan-kou-ying-she/index.html">
                                端口映射
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/fcitx/index.html">
                                Fcitx
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/fedora/index.html">
                                Fedora
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/find/index.html">
                                find
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/foxmarks/index.html">
                                Foxmarks
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/gdb/index.html">
                                GDB
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/git/index.html">
                                Git
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/gong-ju/index.html">
                                工具
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/grep/index.html">
                                grep
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/htc/index.html">
                                HTC
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/ids/index.html">
                                IDS
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/java/index.html">
                                Java
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/jiao-ben/index.html">
                                脚本
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/jiao-huan-ji/index.html">
                                交换机
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/kde/index.html">
                                KDE
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/kong-jian/index.html">
                                控件
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/ld/index.html">
                                ld
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/libpcap/index.html">
                                libpcap
                            </a>
                        </li>
                        <li class="list-group-item tag-1">
                            <a href="http://hutaow.com/blog/tags/linux/index.html">
                                Linux
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/lu-you-qi/index.html">
                                路由器
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/mplayer/index.html">
                                MPlayer
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/mysql/index.html">
                                MySQL
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/nei-cun/index.html">
                                内存
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/network/index.html">
                                Network
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/openwrt/index.html">
                                OpenWRT
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/oprofile/index.html">
                                OProfile
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/pei-zhi-wen-jian/index.html">
                                配置文件
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/protocol/index.html">
                                Protocol
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/pxe/index.html">
                                PXE
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/pyqt/index.html">
                                PyQT
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/python/index.html">
                                Python
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/qt/index.html">
                                QT
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/rhythmbox/index.html">
                                Rhythmbox
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/ru-qin-jian-ce/index.html">
                                入侵检测
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/rxvt/index.html">
                                RXVT
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/samba/index.html">
                                Samba
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/script/index.html">
                                Script
                            </a>
                        </li>
                        <li class="list-group-item tag-2">
                            <a href="http://hutaow.com/blog/tags/security/index.html">
                                Security
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/sed/index.html">
                                sed
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/shu-ju-ku/index.html">
                                数据库
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/signal/index.html">
                                Signal
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/smb/index.html">
                                SMB
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/snort/index.html">
                                Snort
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/sql/index.html">
                                SQL
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/taglist/index.html">
                                TagList
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/tcp/index.html">
                                TCP
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/vi/index.html">
                                VI
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/virtualbox/index.html">
                                VirtualBox
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xia-mi-yin-le/index.html">
                                虾米音乐
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xie-yi/index.html">
                                协议
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xin-hao/index.html">
                                信号
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/xin-xi-an-quan/index.html">
                                信息安全
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xing-neng-you-hua/index.html">
                                性能优化
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xmarks/index.html">
                                Xmarks
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/xml/index.html">
                                XML
                            </a>
                        </li>
                        <li class="list-group-item tag-3">
                            <a href="http://hutaow.com/blog/tags/yin-le-ezhan/index.html">
                                音乐e栈
                            </a>
                        </li>
                        <li class="list-group-item tag-4">
                            <a href="http://hutaow.com/blog/tags/zi-fu-bian-ma/index.html">
                                字符编码
                            </a>
                        </li>
                    </ul>
                </li>    
    <li class="list-group-item"><h4><i class="fa fa-external-link-square fa-lg"></i><span class="icon-label">Links</span></h4>
      <ul class="list-group" id="links">
        <li class="list-group-item">
            <a href="http://www.jingchao.me/" target="_blank">
                荆超的小站
            </a>
        </li>
      </ul>
    </li>

        </ul>
    </section>

</aside>        </div>
    </div>
</div>
<footer>
   <div class="container">
      <hr>
      <div class="row">
         <div class="col-xs-10">© 2015 hutaow
            · Powered by <a href="https://github.com/DandyDev/pelican-bootstrap3" target="_blank">pelican-bootstrap3</a>,
            <a href="http://docs.getpelican.com/" target="_blank">Pelican</a>,
            <a href="http://getbootstrap.com/" target="_blank">Bootstrap</a>              <p><small>  <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="./MySQL协议分析 - 胡桃夹子_files/80x15.png"></a>
    "<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">胡桃夹子</span>" by <a xmlns:cc="http://creativecommons.org/ns#" href="http://hutaow.com/" property="cc:attributionName" rel="cc:attributionURL">hutaow</a> is
  licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution 4.0 International License</a>, except where indicated otherwise.
</small></p>
         </div>
         <div class="col-xs-2"><p class="pull-right"><i class="fa fa-arrow-up"></i> <a href="http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/#">Back to top</a></p></div>
      </div>
   </div>
</footer>
<script src="./MySQL协议分析 - 胡桃夹子_files/jquery.min.js.下载"></script>

<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="./MySQL协议分析 - 胡桃夹子_files/bootstrap.min.js.下载"></script>

<!-- Enable responsive features in IE8 with Respond.js (https://github.com/scottjehl/Respond) -->
<script src="./MySQL协议分析 - 胡桃夹子_files/respond.min.js.下载"></script>

    <!-- Disqus -->
    <script type="text/javascript">
        /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
        var disqus_shortname = 'hutaow'; // required: replace example with your forum shortname

        /* * * DON'T EDIT BELOW THIS LINE * * */
        (function () {
            var s = document.createElement('script');
            s.async = true;
            s.type = 'text/javascript';
            s.src = '//' + disqus_shortname + '.disqus.com/count.js';
            (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
        }());
    </script>
    <!-- End Disqus Code -->
    <!-- Google Analytics -->
    <script type="text/javascript">

        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-17662168-1']);
        _gaq.push(['_trackPageview']);

        (function () {
            var ga = document.createElement('script');
            ga.type = 'text/javascript';
            ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(ga, s);
        })();
    </script>
    <!-- End Google Analytics Code -->
    <!-- Baidu Tongji Code -->
    <script type="text/javascript">
        var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
        document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F468180fb1dabd18b0fa314e09b728e22' type='text/javascript'%3E%3C/script%3E"));
    </script><script src="./MySQL协议分析 - 胡桃夹子_files/h.js.下载" type="text/javascript"></script>
    <!-- End Baidu Tongji Code -->

</body></html>